#ifndef SERIAL_H
#define SERIAL_H
#ifdef __cplusplus
extern "C" {
#endif

#include "public.h"
#include "ringbuffer.h"
#include <stdint.h>
#include <stddef.h>

typedef enum {
    SERIAL_MODE_INT_RX   = 0x01, // 中断接收
    SERIAL_MODE_INT_TX   = 0x02, // 中断发送
    SERIAL_MODE_DMA_RX   = 0x04, // DMA接收
    SERIAL_MODE_DMA_TX   = 0x08, // DMA发送
} serial_mode_t;

typedef struct {
    int fd;                        // 句柄
    USART_TypeDef *uart;           // 硬件串口
    ringbuffer_t rx_rb;            // 接收环形缓冲区
    ringbuffer_t tx_rb;            // 发送环形缓冲区
    uint8_t *dma_rx_buf;           // DMA接收buffer
    size_t dma_rx_buf_size;        // DMA接收buffer大小
    volatile size_t dma_rx_last;   // 上次DMA接收指针
    serial_mode_t mode;            // 当前工作模式
    // 其他硬件相关成员，如DMA句柄等
} serial_t;

int serial_init(serial_t *serial, USART_TypeDef *uart, serial_mode_t mode,
                uint8_t *rx_rb_buf, size_t rx_rb_size,
                uint8_t *tx_rb_buf, size_t tx_rb_size,
                uint8_t *dma_rx_buf, size_t dma_rx_buf_size);

size_t serial_read(int fd, uint8_t *buf, size_t len);
size_t serial_write(int fd, const uint8_t *buf, size_t len);

void serial_irq_handler(serial_t *serial); // 在中断服务函数中调用
void serial_dma_rx_cplt_callback(serial_t *serial); // DMA接收完成回调
void serial_dma_tx_cplt_callback(serial_t *serial); // DMA发送完成回调

#endif 